package main.old.new_2023.last.month_6;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description:
 * //TODO 2611. 老鼠和奶酪
 * 有两只老鼠和 n 块不同类型的奶酪，每块奶酪都只能被其中一只老鼠吃掉。
 * 下标为 i 处的奶酪被吃掉的得分为：
 * 如果第一只老鼠吃掉，则得分为 reward1[i] 。
 * 如果第二只老鼠吃掉，则得分为 reward2[i] 。
 * 给你一个正整数数组 reward1 ，一个正整数数组 reward2 ，和一个非负整数 k 。
 * 请你返回第一只老鼠恰好吃掉 k 块奶酪的情况下，最大 得分为多少。
 *
 * //todo 剑指 Offer 67. 把字符串转换成整数
 * 写一个函数 StrToInt，实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
 * 首先，该函数会根据需要丢弃无用的开头空格字符，直到寻找到第一个非空格的字符为止。
 * 当我们寻找到的第一个非空字符为正或者负号时，则将该符号与之后面尽可能多的连续数字组合起来，作为该整数的正负号；假如第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来，形成整数。
 * 该字符串除了有效的整数部分之后也可能会存在多余的字符，这些字符可以被忽略，它们对于函数不应该造成影响。
 * 注意：假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时，则你的函数不需要进行转换。
 * 在任何情况下，若函数不能进行有效的转换时，请返回 0。
 * 说明：
 * 假设我们的环境只能存储 32 位大小的有符号整数，那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围，请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 * 示例 1:
 * 输入: "42"
 * 输出: 42
 *
 * @Author: Take-off
 * @Date: 1:00 PM 2023/6/5
 * @Param:
 * @return:
 **/
public class Solution0607 {

    //把字符串转换成整数
    public int strToInt(String str) {
        int i = 0;
        Automaton automaton = new Automaton();
        if (str != null && !"".equals(str)){
            for (Character ch:str.toCharArray()){
                automaton.getNum(ch);
            }
        }else {
            return i;
        }
        return (int) (automaton.flag * automaton.num);

    }

    //自动机
    class Automaton {
        public int flag = 1;
        public long num = 0L;
        private String state = "start";
        private Map<String, String[]> table = new HashMap<String, String[]>() {{
            put("start", new String[]{"start", "signed", "in_number", "end"});
            put("signed", new String[]{"end", "end", "in_number", "end"});
            put("in_number", new String[]{"end", "end", "in_number", "end"});
            put("end", new String[]{"end", "end", "end", "end"});
        }};

        public void getNum(Character ch){
            state = table.get(state)[get_col(ch)];
            if ("in_number".equals(state)){
                //加进去
                num = num *10 + ch - '0';
                //判断边界
                num = flag == 1 ? Math.min(num,Integer.MAX_VALUE) :Math.min(num, -(long) Integer.MIN_VALUE);

            }else if ("signed".equals(state)){
                //符号
                flag = ch == '+' ? 1 : -1;
            }
        }

        private int get_col(char c) {
            if (c == ' ') {
                return 0;
            }
            if (c == '+' || c == '-') {
                return 1;
            }
            if (Character.isDigit(c)) {
                return 2;
            }
            return 3;
        }
    }

        //老鼠和奶酪
    public int miceAndCheese(int[] reward1, int[] reward2, int k) {
        //贪心算法，所有都给老鼠2吃，那么 加上 数组1和 数组2 的差排序后  的 k个值，就是答案
        int count = 0;
        List<Integer> diff = new ArrayList<>();
        for (int i = 0;i<reward1.length;i++){
            count += reward2[i];
            diff.add(reward1[i] - reward2[i]);
        }
        diff = diff.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        for (int j =0;j<k;j++){
            count+=diff.get(j);
        }
        return count;
    }


    public static void main(String[] args) {
        Solution0607 solu = new Solution0607();



    }

}
